/******************************************************************************
* 文件名称: uds_tp.c
* 内容摘要: UDS 协议栈 TP 层头文件，基于 ISO 15765-2
* 创建者の: 孔佳伟
* 个人主页: https://gitee.com/thin-wind/jump
* 修改记录: 
******************************************************************************/
#ifndef _UDS_TP_H_
#define _UDS_TP_H_

/*******************************************************************************
    Include Files
*******************************************************************************/
#include <stdint.h>
#include "uds_type.h"

typedef enum _N_TATYPE_T_
{
    N_TATYPE_NONE = 0,
    N_TATYPE_PHYSICAL,
    N_TATYPE_FUNCTIONAL
}n_tatype_t;

typedef enum _N_RESULT_
{
    N_OK = 0,
    N_TIMEOUT_A,
    N_TIMEOUT_Bs,
    N_TIMEOUT_Cr,
    N_WRONG_SN,
    N_INVALID_FS,
    N_UNEXP_PDU,
    N_WFT_OVRN,
    N_BUFFER_OVFLW,
    N_ERROR
}n_result_t;

typedef void (*ffindication_func) (uint16_t msg_dlc);
typedef void (*indication_func) (uint8_t* msg_buf, uint16_t msg_dlc, n_result_t n_result);
typedef void (*confirm_func) (n_result_t n_result);

typedef struct _NETWORK_USER_DATA_T_
{
    ffindication_func   ffindication;
    indication_func     indication;
    confirm_func        confirm;
}nt_usdata_t;

/*******************************************************************************
    external Varaibles
*******************************************************************************/
extern uint8_t g_tatype;

/*******************************************************************************
    Function  Definition
*******************************************************************************/


/**
 * network_main - network main task, should be schedule every one ms
 *
 * @void
 *
 * returns:
 *     void
 */
extern void
network_main(void);


/******************************************************************************
* 函数名称: uds_tp_recv_frame(uint8_t func_addr, uint8_t* buf, uint8_t len)
* 功能说明: 接收到一帧报文并处理
* 输入参数: uint8_t     func_addr       --0:物理寻址; 1:功能寻址
    　　　　uint8_t*    frame_buf       --接收报文帧数据首地址
    　　　　uint8_t     frame_dlc       --接收报文帧数据长度
* 输出参数: 无
* 函数返回: 无
* 其它说明: frame_dlc 长度必须等于 FRAME_SIZE，否则判断为无效帧
******************************************************************************/
void uds_tp_recv_frame(uint8_t func_addr, uint8_t frame_buf[], uint8_t frame_dlc);

/**
 * network_send_udsmsg - send a uds msg by can
 *
 * @msg_buf : uds msg data buffer
 * @msg_dlc : uds msg length
 *
 * returns:
 *     void
 */
int network_send_udsmsg(uint8_t msg_buf[], uint16_t msg_dlc);


/**
 * network_reg - reg usdata Function
 *
 * @usdata : uds msg data Function struct
 *
 * returns:
 *     0 - ok, other - err
 */
int network_reg(nt_usdata_t* usdata);

#endif
/****************EOF****************/
